from git import Repo
from pathlib import  Path
from datetime import datetime


#链接


gitee_link = "https://gitee.com/"
repo_name = "captcha"
repo_link = gitee_link + "anji-plus/captcha"
commits_link = gitee_link + "anji-plus/captcha/commits/master"
authors_link = gitee_link + "anji-plus/captcha/contributors"
branches_link = gitee_link + "anji-plus/captcha/branches"
branch_link = gitee_link + "anji-plus/captcha/tree"
md = f"## {repo_name} Project Data Analysis\n\n"

#添加下划线
md += "---\n\n"

# Path("report.md").write_text(md, "UTF-8")

if Path(repo_name).exists():
    repo = Repo(repo_name)
else:
    print("Cloning Repo...")
    repo = Repo.clone_from(repo_link,repo_name)
    print("Finished Cloning!")


print("Loaded repo!")
# print(repo.active_branch)

# Overview
repo_commits = list(repo.iter_commits())
first_commit = repo_commits[-1]
latest_commit = repo_commits[0]
print(len(repo_commits))
start_date = datetime.fromtimestamp(first_commit.authored_date)
latest_date = datetime.fromtimestamp(latest_commit.authored_date)

#**黑体
md += f"**Start Date:** {start_date}\n\n"
md += f"**Latest Update:** {latest_date}\n\n"
md += f"[**Commits:** {len(repo_commits)}]({commits_link})\n\n"


# Branches
gitee = repo.remotes[0]
gitee_branches = [ref.name[7:] for ref in gitee.refs if ref.name !="origin/HEAD"]
gitee_branches.remove("master")
repo_branches = ["maser"] + gitee_branches
for branch in gitee_branches:
    print(branch)
md += f"[**Branches:** {len(repo_branches)}]({branches_link})\n\n"


# Authors
author_data = {}
for commit in repo_commits:
    author = commit.author.name
    if author not in author_data:
        author_data[author] = 1
    else:
        author_data[author] += 1
author_data = sorted(author_data.items(),key=lambda data: data[1],reverse=True)
md += f"[**Authors:** {len(author_data)}]({authors_link})\n\n"


md += "## Branches\n\n"
for branch in repo_branches:
    md += f"- [{branch}]({branch_link})\n\n"

md += "## Top 10 Authors\n\n"


for i in range(10):
    author = author_data[i]
    name = author[0].replace(" ","")
    commits = author[1]
    md += f"{i + 1}. [{name}]({gitee_link + name}): {commits} commits\n\n"
# print(author_data)

# -------------------- 新增：提交统计分析 --------------------
# 初始化数据存储列表
lines_changed = []  # 每次提交修改的行数
files_changed = []  # 每次提交修改的文件数
commit_stats = []   # 提交统计原始数据

# 从缓存文件读取或重新收集提交统计数据
if Path("commit_stats.txt").exists():
    print("READING FROM CACHE")
    with open("commit_stats.txt", "r") as file:
        commit_stats = file.readlines()
else:
    print("WRITING TO CACHE")
    with open("commit_stats.txt", "w") as file:
        for commit in repo_commits:
            stats = str(commit.stats.total)  # 获取提交的统计信息
            commit_stats.append(stats)
            file.write(f"{stats}\n")  # 保存到缓存文件避免重复计算

# 解析统计数据
for stats in commit_stats:
    stat = ast.literal_eval(stats)  # 将字符串安全转换为字典
    lines_changed.append(stat['lines'])
    files_changed.append(stat['files'])

# 添加提交统计分析到报告
md += "## Commit Stats\n\n"

# 使用NumPy计算统计指标（转换为整数便于阅读）
lines_changed = np.array(lines_changed)
files_changed = np.array(files_changed)
mean_lines_changed = int(np.mean(lines_changed))
median_lines_changed = int(np.median(lines_changed))
mean_files_changed = int(np.mean(files_changed))
median_files_changed = int(np.median(files_changed))

# 将统计结果添加到报告
md += f"**Average Lines Changed / Commit:** {mean_lines_changed}\n\n"
md += f"**Median Lines Changed / Commit:** {median_lines_changed}\n\n"
md += f"**Average Files Changed / Commit:** {mean_files_changed}\n\n"
md += f"**Median Files Changed / Commit:** {median_files_changed}\n\n"

Path("report-captcha.md").write_text(md,"UTF-8")
